package thread.ThreadPool;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 自定义线程池<br/>
 * 如果想实现线程池的监控，必须要自定义线程池继承ThreadPoolExecutor类，<br/>
 * 并且实现beforeExecute，afterExecute和terminated方法，我们可以在任务执行前，<br/>
 * 执行后和线程池关闭前干一些事情。如监控任务的平均执行时间，最大执行时间和最小执行时间等。<br/>
 * @author liyl
 *
 */
public class MonitorThreadPoolExecutor extends ThreadPoolExecutor{

	public MonitorThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
		super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
	}
	
	//每执行一个工作任务线程之前都会执行此实现的方法
	protected void beforeExecute(Thread t, Runnable r) { 
		System.out.println("线程执行前.........");
	}
	
	//每执行一个工作任务线程之后都会执行的方法
	protected void afterExecute(Runnable r, Throwable t) { 
		System.out.println("线程执行后.........");
	}
	
	//线程池关闭之前可以干一些事情；
	protected void terminated() {
		System.out.println("线程池中任务数量" + this.getTaskCount());
	};
}
